package DigitalNetwork;

import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * Az egyseg kimeneti erteket tarolja. A rakapcsolt bemeneteket frissiti, ha erteke megvaltozik.
 *
 * @author Ableda Peter
 * @author Andrasi Istvan
 * @author Kamaras Karoly
 * @author Pora Szilard
 *
 * @version 1.0 Build 2011.04.17.
 */
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
public class PortOut extends Port {

	/** targets: Azok a bementek, akiket frissiteni kell,
	 * ha megvaltozott a kimeneti ertek. */
	private List<PortIn> targets;
	/** frissites szamlalo */
	private int updateCount;

	/** [Konstruktor]
	 *  Letrehozza a tragets listat.
	 */
	//==========================================================================
	public PortOut(String ID_, Unit u) {
		super(u);
		this.ID = ID_; /* Ez protoban mar szerintem nem kellene. Isi */
		/** Targetek listajanak letrehozasa*/
		this.targets = new ArrayList<PortIn>();
	}
	//==========================================================================

	/**
	 * Az uj ertek beallitasa.
	 *
	 * @param high Az uj ertek.
	 */
	//==========================================================================
	public void setState(boolean high) {
		// Ha valtozott az allapota:
		if (this.isHigh != high) {
			// Ha tul sokadszorra frissul:
			if (this.updateCount > 1000) {
				Main.printMessage("#[WARNING] A halozat instabil!");
				return;
			} else {
				// Belso allapota frissul.
				this.isHigh = high;
				this.updateCount += 1;
				// A meghajtott bemeneteken meghivja az update()-et*/
				ListIterator<PortIn> i = this.targets.listIterator();
				while (i.hasNext()) {
					PortIn P = i.next();
					P.update(this.isHigh);
				}
			}
		}
	}
	//==========================================================================

	/**
	 * Kinullazza a frissites szamlalot.
	 */
	//==========================================================================
	public void resetUpdateCount() {
		this.updateCount = 0;
	}
	//==========================================================================

	/** 
	 * Rakot egy bemenetet.
	 *
	 * @param target Az adott bemenet.
	 * @return Igaz, ha sikerült rakotni, hamis, ha nem.
	 */
	//==========================================================================
	public boolean addTarget(PortIn target) {
		/* Ha a bementet mar egy masik kimenet meghajtja: */
		if (target.isConnected()) {
			return false;
		} else {
			/* Egyebkent, meghajtuk, es beallitjuk, hogy csatlakoztatva van. */
			this.targets.add(target);
			target.setConnected();
			this.setConnected();
			return true;
		}
	}
	//==========================================================================

	/**
	 * Visszaadja az aktualis egyseg nevet es ID-jet.
	 *
	 * @return String Elem neve.
	 */
	//==========================================================================
	public String getName() {
		return "(PortOut)" + this.ID;
	}
	//==========================================================================
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

